import Vue from 'vue'
import Router from 'vue-router'
import routes from './routes.js'
import store from '@/store/store.js'

Vue.use(Router)

// 保留别人的(备份)重写底层为其添加promise处理函数
// 保留别人的方法,
const originalPush = Router.prototype.push
// 给push重写,第一个参数是跳转的地址,第二个是成功的回调,第三个是失败的回调
Router.prototype.push = function push(location, reject, resolve) {
  // 传了成功or失败的回调
  if (reject && resolve) {
    originalPush.call(this, location, reject, resolve)
  } else {
    // 只传了一个回调,自己手动抛出异常,为一个空的成功或失败的函数
    originalPush.call(this, location, () => { }, () => { })
  }
}

let router = new Router({
  routes,
  scrollBehavior() {
    return { y: 0 }
  }
})

// 路由守卫(全局,跳转前进行判断)
router.beforeEach(async (to, from, next) => {
  // 获取仓库内的token
  // let token = store.state.register.token
  let token = localStorage.getItem('TOKEN')
  // 判断是否已经登录
  if (token) {
    // 判断已经登录了用户是否还想回登录页面
    if (to.path == '/login') {
      next('/home')
      console.log('登录了还访问login');
    } else {
      // 用户登录了访问其他页面(除登录以外的页面)
      let name = store.state.register.userinfo.nickName
      // 需要判断是否有用户的信息对象
      if (name) {
        // 有则放行
        next()
        console.log('第三层已经有token,已经获取到用户的信息情况下');
      } else {
        // 没有则尝试拿token,去派发actions拿用户信息对象
        // 拿用户信息(判断用户是否登录了,因为在这里发送了请求才有数据,其他页面没发请求(有token),所以没数据)
        try {
          // 派发actions拿对象
          let res = await store.dispatch('register/getUserInfo')
          console.log('用户有token,但是没用户信息对象,尝试带着token去请求信息数据');
          next()
        } catch (error) {
          // 此时用户虽然有token,但是可能已经过期了,
          console.log(error);
          console.log('token出现了意外');
          // 告诉服务器和本地删除用户的信息对象和token,方便下次派发新的
          localStorage.removeItem('TOKEN')
          this.$store.dispatch('register/logout')
          next('/login')
        }
      }
      console.log('第二层放行');
    }
    console.log('第一层已经登录');
  } else {
    // 未登录:不能去交易、支付相关的页面、以及个人中心
    // 未登录去上面这些路由强制跳转到login
    let toPath = to.path
    // console.log(toPath);
    // 这里一举多得 用 toPath == 就很麻烦
    if (toPath.indexOf('/pay') !== -1 || toPath.indexOf('/center') !== -1 || toPath.indexOf('/trade') !== -1) {
      // 把未登录的时候想去,而没有去成的信息,存储于地址栏中(路由的query中)
      next('/login?redirect=' + toPath)
    } else {
      // 未登录,去的不是以上这些路由则放行(home,search,shopcart)
      next()
    }
  }
})

export default router